package com.yinxianren.main.mybatis_plus;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yinxianren.main.study.mybatis_plus.dao.UserMapper;
import com.yinxianren.main.study.mybatis_plus.entity.User;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *测试创建、更新、删除
 *
 * CREATE TABLE USER
 (
 id BIGINT(20) NOT NULL COMMENT '主键ID',
 NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
 age INT(11) NULL DEFAULT NULL COMMENT '年龄',
 email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
 PRIMARY KEY (id)
 );


 INSERT INTO USER (id, NAME, age, email) VALUES
 (1, 'Jone', 18, 'test1@baomidou.com'),
 (2, 'Jack', 20, 'test2@baomidou.com'),
 (3, 'Tom', 28, 'test3@baomidou.com'),
 (4, 'Sandy', 21, 'test4@baomidou.com'),
 (5, 'Billie', 24, 'test5@baomidou.com');
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class CRUD_CUD {

    @Autowired
    private UserMapper userMapper;

    /**
     * <p>
     * 插入一条记录
     * </p>
     *
     * @param entity 实体对象
     * @return 插入成功记录数
     * int insert(T entity);
     */
    @Test
    public void insert(){
        User user=new User();
        user.setId(6L);
        user.setName("张无忌");
        user.setAge(28);
        user.setCreateTime(LocalDateTime.now());
        user.setEmail("zhangwuji@163.com");
        userMapper.insert(user);
    }


    /**
     * <p>
     * 根据 ID 删除
     * </p>
     *
     * @param id 主键ID
     * @return 删除成功记录数
     *
     *    int deleteById(Serializable id);
     */

    @Test
    public void delectById(){
        userMapper.deleteById(6);
    }

    /**
     * <p>
     * 根据 columnMap 条件，删除记录
     * </p>
     *
     * @param columnMap 表字段 map 对象
     * @return 删除成功记录数
     *
     * int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
     */
    @Test
    public void delectByMap(){
        Map<String,Object> map= new HashMap<>();
        map.put("name","Tom");
        map.put("age",28);
        userMapper.deleteByMap(map);
    }

    /**
     * <p>
     * 根据 entity 条件，删除记录
     * </p>
     *
     * @param wrapper 实体对象封装操作类（可以为 null）
     * @return 删除成功记录数
     *
     * int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
     */
    @Test
    public void delete(){
        //Wrapper 是一个抽象类，拥有很多个子类，具体用法查看子类的方法
//        Wrapper<User> wrapper=new Wrapper();
//        LambdaQueryChainWrapper lambdaQueryChainWrapper=new LambdaQueryChainWrapper(userMapper);
//        lambdaQueryChainWrapper.eq();
        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.eq("name","张无忌");
        userMapper.delete(queryWrapper);
    }


    /**
     * <p>
     * 删除（根据ID 批量删除）
     * </p>
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     * @return 删除成功记录数
     *
     *  int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
     *
     */
   @Test
    public void deleteBatchIds(){
        List list= Arrays.asList(new Integer[]{1,2,4,5});
        int record= userMapper.deleteBatchIds(list);
        Assert.assertEquals(record,4);
    }



    /**
     * <p>
     * 根据 ID 修改
     * </p>
     *
     * @param entity 实体对象
     * @return 修改成功记录数
     * int updateById(@Param(Constants.ENTITY) T entity);
     */
    @Test
   public void updateById(){
        User user=new User();
        user.setId(1L);
        user.setName("黄杰");
        user.setEmail("huangjie@163.com");
        user.setCreateTime(LocalDateTime.now());
        userMapper.updateById(user);
   }

    /**
     * <p>
     * 根据 whereEntity 条件，更新记录
     * </p>
     *
     * @param entity        实体对象 (set 条件值,可为 null)
     * @param updateWrapper 实体对象封装操作类（可以为 null,里面的 entity 用于生成 where 语句）
     * @return 修改成功记录数
     *
     * int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper)
     */

   @Test
   public void update(){
       User user=new User();
       user.setId(1L);
       user.setName("黄三");
       user.setEmail("huangsan@163.com");
       user.setCreateTime(LocalDateTime.now());
       QueryWrapper queryWrapper=new QueryWrapper();
       queryWrapper.eq("name","黄杰");
       userMapper.update(user,queryWrapper);
   }





}
